// 统一token的cookie存储名称
import { hasOwnProp } from '../utils/normalUtils'
import { reactive } from 'vue'
import { appState } from './appManager'
import { delCookie, getCookie, saveCookie } from './CookieManager'

const cookieTokenName = 'ww_ff_cs'
// 本地token存储名称
const sessionTokenName = 'fa_fa_rr'
// 直接存下用户信息 不调获取用户信息接口了
const userCatchName = 'uu_rr'
const allPermissionFlag = '*:*:*'//* :*:*

/**
 * 权限集合
 */
export const permissionMap:any = {}
export const permissionState = reactive({
   isSuper: false
})

/**
 * 初始化权限集合
 * @param permissionList
 */
export function initPermission(permissionList:any[]) {
    if (permissionList.length === 1 && permissionList[0].permission === allPermissionFlag) {
        permissionState.isSuper = true
        return
    }
    for (const item of permissionList) {
        permissionMap[item.permission] = true
    }
}

/**
 * 验证是否有某个权限
 * @param permissionCode
 */
export function hasPermission(permissionCode:string) {
    return permissionState.isSuper || hasOwnProp(permissionMap, permissionCode)
}

/**
 * 验证是否有某个权限
 * @param permissionCode
 */
export function hasAnyPermission(permissionCode:string) {
    if (permissionState.isSuper) return true
    const arr = permissionCode.split(',')
    for (const item of arr) {
        if (hasPermission(item)) return true
    }
    return false
}


/**
 * 初始化 系统缓存用户信息
 */
export function initSystemCatch() {
    const userInfo = getCookieUser()
    if (userInfo)saveToken(userInfo.token)
    return userInfo
}

/**
 * 保存用户信息
 * @param userInfo
 */
export function saveSystemCatch(userInfo:any) {
    saveCookieUser(userInfo.userName, userInfo.userId, userInfo.token)
    saveToken(userInfo.token)
}

/**
 * 清楚缓存数据
 * @param
 */
export function clearSystemCatch() {
    clearToken()
    delCookie(userCatchName)
}

/**
 * 获得缓存cookie 正常不用存用户名 接口设计需要用户名 一起存
 */
export function getCookieUser() {
    const userInfo = getCookie(userCatchName)
    if (!userInfo || userInfo.indexOf('|*|*|') === -1) return null
    const arr = userInfo.split('|*|*|')
    if (arr.length !== 3) return null
    return {
        userName: arr[0],
        userId: arr[1],
        token: arr[2]
    }
}

/**
 * 获得缓存cookie
 */
export function saveCookieUser(userName:string, userId:string, token:string) {
    const saveValue = (userName + '|*|*|' + userId + '|*|*|' + encodeURIComponent(token))
    saveCookie(userCatchName, saveValue)
}


/**
 * 获取token
 */
export function getToken(): string | null {
    return sessionStorage.getItem(sessionTokenName)
}


/**
 * 验证当前页数据和token是否匹配
 */
export function validTokenChange(jump = true) {
    const token = getCookieToken()
    const pageToken = getToken()
    if (token && pageToken && (token !== pageToken)) {
        return true
    }
    return false
}

/**
 *
 */
export function validToken() {
    const token = getCookieToken()
    if (!token) return false
    const changed = validTokenChange()
    return !changed
}

/**
 * 获取token
 */
export function getCookieToken(): string | null {
    return getCookie(cookieTokenName)
}

/**
 * 开发环境才有保存 本地保存token
 */
export function saveToken(value:string) {
    sessionStorage.setItem(sessionTokenName, value)
    saveCookie(cookieTokenName, value)
}

/**
 *
 */
export function clearToken() {
    sessionStorage.clear()
    delCookie(cookieTokenName)
}

/**
 *
 */
export function clearPageCatch() {
    sessionStorage.clear()
}

/**
 * 是否拥有路由权限
 * @param route
 */
export function hasRoutePermission(route:string) {
    return hasOwnProp(appState.menuMap, route)
}

